home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 5 / DISK2058.ZIP / UNFAST.EXE / DC.F < prev    next >
Text File  |  1980-01-01  |  33KB  |  1,884 lines

  1. ;Debugger written in FAST.
  2. ;Written by Peter Campbell Jan------ 1988.
  3.  
  4. ;Much faster and more versatile than DEBUG.
  5. ;Able to debug DOS interupts. Screen shows more of use, including all registers
  6. ;and the next 6 instructions in window format.
  7.  
  8. const MAX_SYMBOLS=5120,UNASM_SCREEN=24,DISK_LEN=1024
  9. var TX,POSITION,FINISH,WAITING,WAITFKEY,CUR_IP,CUR_CS,CUR_DX
  10. var CS,IP,BOXING,DISK_OUTPUT,PRINTER_OUTPUT,IO_OUT,SCROLLF
  11. var GET_SYMBOL,SYMBOLS,ORG_IP,BYTE,DPLACE
  12. COMMAND    ? 64
  13. PREVIOUS   ? 64
  14. DISK_START ? DISK_LEN
  15. DISK_END   = DISK_START+DISK_LEN
  16. BUFFER       ? 82
  17. SBUFFER    ? 82
  18.  
  19. #inpend=0
  20. #errors off
  21.  
  22. HEX=1
  23. DELAY=0
  24. FILTER=0
  25.  
  26. proc ememory print bios "Insufficient memory!!!":terminate
  27.  
  28. LAST_TYPED=0
  29. page 0
  30. screen 3
  31. SYS=allocate MAX_SYMBOLS/8+16:if error then ememory
  32. PRG=allocate 4096:if error then ememory ;64k program. temp
  33.  
  34. dos 35(3)
  35. BRK_SEG=reg es:BRK_OFF=reg bx
  36. dos 35(1)
  37. INT_SEG=reg es:INT_OFF=reg bx
  38. dos 35(10)
  39. SCR_SEG=reg es:SCR_OFF=reg bx
  40. poke SOFF,SCR_OFF:poke SSEG,SCR_SEG
  41.  
  42. CUR_REG=0
  43. BOXING=1  ;Initially use a drawn box on the screen.
  44. reg dx=SCRCHK:dos 25(10)
  45.  
  46.  
  47. proc WRITE5(WL,WS)
  48.     {
  49.     if (WL+DPLACE)>=DISK_END then
  50.     {
  51.     write #5,DPLACE-(DISK_START) from DISK_START
  52.     DPLACE=DISK_START
  53.     }
  54.     moveb WL from WS to DPLACE
  55.     DPLACE+=WL
  56.     }
  57.  
  58. proc CLOSE5
  59.     {
  60.     if DPLACE<>DISK_START then
  61.     write #5,DPLACE-(DISK_START) from DISK_START:if error then return
  62.     close #5
  63.     }
  64.  
  65. proc PRINT_OO(OO) if OO then print "on"; else print "off";
  66.  
  67. function YESNO(DEF)
  68.     {
  69.     loctocur
  70.     forever
  71.     {
  72.     wait for keypressed
  73.     K=ucase key
  74.     if K='Y' then print chr K:return 1
  75.     if K='N' then print chr K:return 0
  76.     if K=13 then print:return DEF
  77.     }
  78.     }
  79.  
  80. function END_OF_LINE
  81.     {
  82.     M=BUFFER+79
  83.     while M>=BUFFER
  84.     {
  85.     if peekb M<>' ' then goto END_FOUND
  86.     M--
  87.     }
  88.     END_FOUND:
  89.     return 1+M
  90.     }
  91.  
  92. function COMP_BUFFER
  93.     {
  94.     EST=END_OF_LINE
  95.     ST=BUFFER:F=SBUFFER
  96.     X=0
  97.     while ST below EST
  98.     {
  99.     B=peekb ST
  100.     if B=' ' then
  101.         {
  102.         BL=(X and 248)+8
  103.         FLAG=1
  104.         for A=1 to BL-X
  105.           if peekb (ST+A-1)<>' ' then goto SPPUT
  106.         next A
  107.         B=9:ST+=A-2:X=BL-1
  108.         }
  109.     SPPUT:
  110.     pokeb F,B:F++
  111.     X++:ST++
  112.     }
  113.     poke F,0a0dh
  114.     return F+2-(SBUFFER)
  115.     }
  116.  
  117. proc OUTPUT_LINE
  118.     {
  119.     if IO_OUT then
  120.     {
  121.     OW=80:if BOXING then OW=68
  122.     if PRINTER_OUTPUT then
  123.     {
  124.     reg dx=0,ax=2:int 17h:PS=high reg ax
  125.     if (PS and 00111001b)<>00010000b then
  126.         {
  127.         PRINTER_OUTPUT=0
  128.         print "Printer not ready!":beep:return
  129.         }
  130.  
  131.     OM=4000-160 ; Bottom line.
  132.     repeat OW lprint chr video[OM]b;:OM+=2
  133.     lprint
  134.     }
  135.     if DISK_OUTPUT then
  136.     {
  137.     OM=4000-160 ; Bottom line.
  138.     fill 40 from BUFFER with 2020h
  139.     DO=BUFFER
  140.     repeat OW pokeb DO,video[OM]b:OM+=2:DO++
  141.     WRITE5(COMP_BUFFER,SBUFFER)
  142.     if error then DISK_OUTPUT=0:CLOSE5:print "Disk file error!":beep
  143.     }
  144.     }
  145.     }
  146.  
  147. proc PRINT_8088(P8_ADD)
  148.     {
  149.     LEN8=0
  150.     while peekb P8_ADD print chr peek P8_ADD;:P8_ADD++:LEN8++
  151.     repeat 7-LEN8 print " ";
  152.     }
  153.  
  154. proc PRINT_8088W(P8_ADD)
  155.     {
  156.     LEN8=0
  157.     while peekb P8_ADD print chr peek P8_ADD;:P8_ADD++:LEN8++
  158.     if BYTE and 1 then print "W"; else print "B";
  159.     if 6-LEN8 then repeat 6-LEN8 print " ";
  160.     }
  161.  
  162. proc SKIP while peekb POSITION=' ' POSITION++
  163.  
  164. function END_LINE
  165.     {
  166.     SKIP
  167.     if peekb POSITION=13 then return 1
  168.     return 0
  169.     }
  170.  
  171. function DIGIT
  172.     {
  173.     L=peekb POSITION
  174.     if (L=' ') or (L=':') or (L=13) then return 100
  175.     POSITION++
  176.     LNUM=L-'0'
  177.     if LNUM>9 then LNUM-=7
  178.     if (LNUM<0) or (LNUM>15) then return 255
  179.     return LNUM
  180.     }
  181.  
  182. function HEX_NUMBER(DEFAULT)
  183.     {
  184.     DIGCNT=0:VALUE=0
  185.     while DIGCNT<4
  186.     {
  187.     X=DIGIT
  188.     if X=100 then goto CHECK_NUM
  189.     if X=255 then print "Must be hex notation.":ANY_ERRORS=1:return
  190.     VALUE=VALUE*16+X:DIGCNT++
  191.     }
  192.     CHECK_NUM:
  193.     if not DIGCNT then return DEFAULT
  194.     return VALUE
  195.     }
  196.  
  197. proc UNASM_CLINE
  198.     {
  199.     X=68-((locpos mod 160)/2)
  200.     if X>0 then repeat X print " ";
  201.     }
  202.  
  203. function WAIT_KEY
  204.     {
  205.     if WAITFKEY then
  206.     {
  207.     if WAITING then
  208.     {
  209.     wait for keypressed
  210.     KS=keyscan:R=low KS
  211.     if R=13 then WAITING=0
  212.     if R=27 then return 1
  213.     }
  214.     if keypressed then
  215.     {
  216.     KS=keyscan:R=low KS
  217.     if R=27 then return 1
  218.     if R<>13 then WAITING=1
  219.     t2:
  220.     }
  221.     else
  222.     {
  223.     if DELAY then repeat DELAY*6000 {}
  224.     }
  225.     }
  226.     return 0
  227.     }
  228.  
  229. proc NEW_SEG(NEWS,NEWO)
  230.     {
  231.     SKIP
  232.     if peekb POSITION=':' then print "Segment?":ANY_ERRORS=1:return
  233.     if peekb POSITION=13 then return
  234.     N=HEX_NUMBER(N):if ANY_ERRORS then return
  235.     SKIP
  236.     if (peekb POSITION=13) or (peekb POSITION<>':') then NEWO=N:return
  237.     POSITION++:NEWS=N
  238.     NEWO=HEX_NUMBER(NEWO)
  239.     }
  240.  
  241. proc DUMP_HEX(DS,DX)
  242.     {
  243.     ENDED=0  ;Say not at last range byte.
  244.     printh DS;":";DX;"  ";
  245.     repeat 8 printhb DS[DX];DS[1+DX];" ";:DX+=2
  246.     DX-=16
  247.     print " ";
  248.     repeat 16
  249.     {
  250.     if DX=FINISH then ENDED=1
  251.     p=DS[DX]
  252.     if FILTER then
  253.         {
  254.         p=p and 127
  255.         if p<32 then p='.'
  256.         }
  257.     print chr p;:DX++
  258.     }
  259.     }
  260.  
  261. proc INSERT_CHAR(ASCII)
  262.     {
  263.     moveb 63-TX from COMMAND+TX to COMMAND+TX+1
  264.     pokeb COMMAND+TX,ASCII:TX++
  265.     }
  266.  
  267. proc REG_BAR(COL)
  268.     {
  269.     locate CUR_REG+1,70
  270.     SCR=CUR_REG*160+160+70*2+1
  271.     repeat 9 video[SCR]b=COL:SCR+=2
  272.     }
  273.  
  274. proc MAKE_SYMBOL(MA)
  275.     {
  276.     if (MA below ORG_IP) or (MA above FINISH) then return
  277.     if GET_SYMBOL then
  278.     {
  279.     if SYMBOLS then if search SYMBOLS from SYS|1 for MA then return
  280.     SYS[SYMBOLS*2+1]=MA:SYMBOLS++
  281.     }
  282.     }
  283.  
  284. proc PRINT_ADDRESS(PA_NUM)
  285.     {
  286.     MAKE_SYMBOL(PA_NUM)
  287.     if (MA below ORG_IP) or (MA above FINISH) then
  288.     {
  289.     if PA_NUM above 9fffh then print "0";
  290.     printh PA_NUM;"h";
  291.     }
  292.     else printh "L";PA_NUM;
  293.     }
  294.  
  295. proc PRINT_W(OO)
  296.     {
  297.     if OO and 1 then print "AX"; else print "AL";
  298.     }
  299.  
  300. proc PRINT_BYTE(PB_NUM)
  301.     {
  302.     if HEX then
  303.     {
  304.     if PB_NUM above 9fh then print "0";
  305.     printhb PB_NUM;"h";
  306.     }
  307.     else printb PB_NUM;
  308.     }
  309.  
  310. proc PRINT_WORD(PW_NUM)
  311.     {
  312.     if HEX then
  313.     {
  314.     PRINT_ADDRESS(PW_NUM)
  315.     }
  316.     else
  317.     {
  318.     MAKE_SYMBOL(PW_NUM)
  319.     if (MA below ORG_IP) or (MA above FINISH) then print PW_NUM;
  320.         else printh "L";PW_NUM;
  321.     }
  322.     }
  323.  
  324. proc PRINT_REG(A,R)
  325.     {
  326.     A+=(R and 7)*2
  327.     print chr peek A;chr peek (A+1);
  328.     }
  329.  
  330. proc PRINT_RW(RB)
  331.     {
  332.     if RB and 1
  333.     then PRINT_REG(REGW,RB)
  334.     else PRINT_REG(REGB,RB)
  335.     }
  336.  
  337. proc PRINT_MRM(MB,BW)
  338.     {
  339.     printh "[";
  340.     M_MOD=MB/64
  341.     M_RM=MB and 7
  342.     if (M_MOD=0) and (M_RM=6) then
  343.     {
  344.     PRINT_WORD(CS[IP]):IP+=2
  345.     goto EXIT_PRM
  346.     }
  347.     if M_MOD=3 then
  348.     {
  349.     REGT=REGB:if BW and 1 then REGT=REGW
  350.     locpos-=2
  351.     PRINT_REG(REGT,M_RM)
  352.     return
  353.     }
  354.     MSG=(searchb 100 from TABLE_RM for M_RM)+1
  355.     while peekb MSG<>255 print chr peek MSG;:MSG++
  356.     if M_MOD=2 then print "+";:PRINT_WORD(CS[IP]):IP+=2:goto EXIT_PRM
  357.     if M_MOD=1 then
  358.     {
  359.     DISP=CS[IP]b:IP++
  360.     if DISP<128
  361.         then print "+";:PRINT_BYTE(DISP)
  362.         else print "-";:PRINT_BYTE(256-DISP)
  363.     }
  364.     EXIT_PRM:
  365.     print "]";
  366.     }
  367.  
  368. function UNASSEMBLE_LINE(CS,IP)
  369.     {
  370.     BYTE=CS[IP]b
  371.     IADD=peek(LOOKUP_CODES+BYTE*2)
  372.     if (IADD>=FIRST_MESSAGE) and (IADD<=LAST_MESSAGE) then
  373.     {
  374.     PRINT_8088(IADD)
  375.     UNASM_CLINE
  376.     IP++
  377.     goto FINISH_UNASM
  378.     }
  379.     if not IADD then
  380.     {
  381.     goto NULL_NOT
  382.  
  383.     NULL_CONTINUE:
  384.     pop DROP_ADDRESS
  385.  
  386.     NULL_NOT:
  387.     PRINT_8088(I_DB)
  388.     PRINT_BYTE(BYTE):IP++
  389.     UNASM_CLINE
  390.     goto FINISH_UNASM
  391.     }
  392.  
  393.     call IADD
  394.  
  395.     FINISH_UNASM:
  396.     return IP
  397.     }
  398.  
  399. function UNASSEMBLE(CS,IP)
  400.     {
  401.     if not GET_SYMBOL then
  402.     {
  403.     START_IP=IP
  404.     printh CS":"IP;" ";
  405.     START_LOC=locpos
  406.     locpos+=15*2
  407.  
  408.     if (SYMBOLS>0) and ((search SYMBOLS from SYS|1 for IP)<>0)
  409.         then printh "L";IP;"  ";
  410.         else print "       ";
  411.     }
  412.  
  413.     IP=UNASSEMBLE_LINE(CS,IP)
  414.  
  415.     if not GET_SYMBOL then
  416.     {
  417.     L1=locpos
  418.     locpos=START_LOC
  419.     LL=IP-START_IP
  420.     repeat LL printhb CS[START_IP];:START_IP++
  421.     if 6-LL then repeat 6-LL print "  ";
  422.     if SCROLLF then print
  423.         else locpos=L1:UNASM_CLINE:locpos=4000-160:OUTPUT_LINE
  424.     }
  425.     else locpos=4000-160
  426.  
  427.     return IP
  428.     }
  429.  
  430. proc BOXES
  431.     {
  432.     if BOXING and (video[0]b<>201) then
  433.     {
  434.     ;Boxing required and not on screen yet.
  435.     colour 7
  436.     scroll 0,0,68,8,0
  437.     scroll 69,0,79,24,0
  438.     locate 0,0
  439.     print chr 201;
  440.     repeat 67 print chr 205;
  441.     print chr 187;
  442.     locate 8,0
  443.     print chr 200;
  444.     repeat 67 print chr 205;
  445.     print chr 188;
  446.     locate 1,0
  447.     repeat 7 print chr 186
  448.     for A=1 to 7:locate A,68:print chr 186;:next A
  449.  
  450.     locate 0,69
  451.     print chr 201;
  452.     repeat 9 print chr 205;
  453.     print chr 187;
  454.     locate 14,69
  455.     print chr 200;
  456.     repeat 9 print chr 205;
  457.     print chr 188;
  458.     for A=1 to 13
  459.     locate A,69:print chr 186;:locate A,79:print chr 186;
  460.     next A
  461.  
  462.     colour 14
  463.     locate 15,69
  464.     print chr 201;
  465.     repeat 9 print chr 205;
  466.     print chr 187;
  467.     locate 24,69
  468.     print chr 200;
  469.     repeat 9 print chr 205;
  470.     print chr 188;
  471.     for A=16 to 23
  472.     locate A,69:print chr 186;:locate A,79:print chr 186;
  473.     next A
  474.  
  475.     colour 15
  476.     restore REG_DISPLAY
  477.     for Y=1 to 13
  478.         readb A,B
  479.         locate Y,71:printh chr A;chr B;"=";
  480.     next Y
  481.  
  482.     locate 16,70:print "F1 Status";
  483.     locate 17,70:print "F2 Unasm";
  484.     locate 18,70:print "F4 Dump";
  485.     locate 23,70:print "F10 Trace";
  486.     }
  487.     if BOXING then
  488.     {
  489.     colour 15
  490.     REGP=REGISTERS
  491.     BOX_START=peek REG_IP
  492.  
  493.     push SCROLLF
  494.     SYMBOLS=0:GET_SYMBOL=0:SCROLLF=1
  495.     for Y=1 to 13
  496.     locate Y,74:printh peek REGP:REGP+=2
  497.     if Y<8 then
  498.         {
  499.         locate Y,2
  500.         UNASM_CLINE
  501.         locate Y,2
  502.         BOX_START=UNASSEMBLE(peek (REGSEGS+2),BOX_START)
  503.         }
  504.     next Y
  505.     pop SCROLLF
  506.     }
  507.     }
  508.  
  509. proc RESET_REGS
  510.     {
  511.     poke REGSEGS,PRG
  512.     poke REGSEGS+2,PRG
  513.     poke REGSEGS+4,PRG
  514.     poke REGSEGS+6,PRG
  515.     poke REG_IP,100H
  516.     fill 8 from REGISTERS with 0
  517.     poke REGISTERS+8,-1 ;Stack.
  518.     CUR_IP=100h
  519.     CUR_DX=100h
  520.     DISK_OUTPUT=0
  521.     PRINTER_OUTPUT=0
  522.     SCROLLF=1
  523.     GET_SYMBOL=0
  524.     }
  525.  
  526. proc LOAD_FILE(FIRST)  ;Calls RESET_REGS from here.
  527.     {
  528.     if FIRST then
  529.     {
  530.     N=82h
  531.     pokeb searchb 127 from 81h for 13,0  ;Make ASCIIZ
  532.     if peekb 81h=0 then FIRST=0
  533.     }
  534.     if not FIRST then
  535.     {
  536.     print "Program name (.COM) ";
  537.     loctocur
  538.     fill 32 from FILENAME+2 with 0
  539.     inputs FILENAME
  540.     if peekb (FILENAME+2)=0 then goto NO_LOAD
  541.     F=searchb peekb (FILENAME+1) from FILENAME+2 for '.'
  542.     if not F then
  543.         {
  544.         F=searchb 64 from FILENAME+2 for 0
  545.         pokeb F,'.'
  546.         pokeb F+1,'C'
  547.         pokeb F+2,'O'
  548.         pokeb F+3,'M'
  549.         pokeb F+4,0
  550.         }
  551.     N=FILENAME+2
  552.     print
  553.     }
  554.     load N,PRG|100h
  555.     if error then
  556.     {
  557.     print "Program not found."
  558.     goto START
  559.     }
  560.     LEN=(searchb 64 from N for 0)-N
  561.     locate 0,34-(LEN/2)
  562.     print " ";
  563.     while peekb N print chr ucase peek N;:N++
  564.     print " ";
  565.     NO_LOAD:
  566.     RESET_REGS
  567.     }
  568.  
  569. proc END_IT_ALL
  570.     {
  571.     reg dx=BRK_OFF,ds=BRK_SEG:dos 25(3)
  572.     reg ds=reg cs
  573.     reg dx=INT_OFF,ds=INT_SEG:dos 25(1)
  574.     reg ds=reg cs
  575.     reg dx=SCR_OFF,ds=SCR_SEG:dos 25(10)
  576.     reg ds=reg cs
  577.     cursor 24,0
  578.     if DISK_OUTPUT then CLOSE5:if error then print "Error closing disk file!":beep
  579.     terminate
  580.     }
  581.  
  582.  
  583. START:
  584. BOXES
  585. locate 13,0
  586. LOAD_FILE(1)  ;Load from command line or get from input.
  587.  
  588.  
  589. MAIN:
  590. TYPED=0:TX=0:INSERT=0
  591. fill 32 from COMMAND with 2020h
  592.  
  593.  
  594. MAIN2:
  595. CUR_CS=peek (REGSEGS+2)
  596. CUR_DS=peek (REGSEGS+6)
  597. BOXES
  598. locate 24,0
  599. print ">";
  600.  
  601. forever
  602. {
  603. if BOXING then REG_BAR(112)
  604. locate 24,1
  605. colour 7
  606. PRT=64
  607. if TYPED then
  608.     {
  609.     for A=1 to TYPED:print chr(peek (COMMAND-1+A));:PRT--
  610.     next A
  611.     }
  612. cursor 24,tx+1
  613. if PRT then repeat PRT print chr' ';
  614.  
  615. if MONO then
  616.     {
  617.     if INSERT then cursor size 7,12 else cursor size 11,12
  618.     }
  619. else
  620.     {
  621.     if INSERT then cursor size 4,7 else cursor size 6,7
  622.     }
  623.  
  624. wait for keypressed
  625. KS=keyscan
  626. SS=high KS
  627. KK=low KS
  628.  
  629. if BOXING then
  630.     {
  631.     REG_BAR(15)
  632.     if KS=20480 then CUR_REG++
  633.     if KS=18432 then CUR_REG--
  634.     if CUR_REG<0 then CUR_REG=12
  635.     if CUR_REG>12 then CUR_REG=0
  636.     if KS=20011 then
  637.     {
  638.     CH=0:PV=0
  639.     locate CUR_REG+1,74:print "    ";:locpos-=8
  640.     GET_PLUS:
  641.     loctocur
  642.     cursor high curpos,low curpos+CH
  643.     wait for keypressed
  644.     KS=keyscan:K=ucase low KS
  645.     if K=27 then goto MAIN
  646.     if K=13 then
  647.         {
  648.         if CH then poke REGISTERS+CUR_REG*2,PV
  649.         goto MAIN
  650.         }
  651.     if KS=3592 then CH=0:print "    ";:locpos-=8
  652.  
  653.     PRT=K
  654.     K-='0'
  655.     if K>9 then K-=7
  656.     if (CH<4) and (K>=0) and (K<16) then
  657.         {
  658.         print bios chr PRT;:CH++
  659.         PV=PV*16+K
  660.         }
  661.     goto GET_PLUS
  662.     }
  663.     REG_BAR(112)
  664.     }
  665.  
  666. if ((KS=16384) or (KS=29952)) and (TX<TYPED) then TYPED=TX
  667. if KS=18176 then TX=0
  668. if KS=20224 then TX=TYPED
  669. if (KS=19200) and (TX>0) then TX--
  670. if (KS=19712) and (TX<62) then TX++
  671. if KS=21248
  672.    then {
  673.     if TX<TYPED then TYPED--
  674.     moveb 64-TX from COMMAND+TX+1 to COMMAND+TX
  675.     }
  676. if KS=15616 then move 32 from PREVIOUS to COMMAND:TYPED=LAST_TYPED:TX=TYPED
  677.  
  678. ;Functions.
  679. locate 24,0
  680. if KS=15104 then print:gosub STATUS:goto MAIN2
  681. if KS=15360 then WAITFKEY=0:print:FINISH=CUR_IP+UNASM_SCREEN:gosub UNASM_FUNC:goto MAIN2
  682. if KS=15872 then WAITFKEY=0:print:FINISH=CUR_DX+127:gosub DUMP_FUNC:goto MAIN2
  683.  
  684. if KS=20992 then INSERT=not INSERT
  685. if (KK=13) and (TYPED>0) then pokeb COMMAND+TYPED,13:goto ENDCOMMAND
  686. if KK=27 then TYPED=0:TX=0
  687. if KS=3592 then
  688.   {
  689.   moveb 63-TX from COMMAND+TX to COMMAND-1+TX
  690.   if (TX<=TYPED) and (TX>0) then TYPED--
  691.   if TX then tx--
  692.   }
  693.  
  694. if KK>31 then
  695.     {
  696.     if TYPED>=62 then beep
  697.     else
  698.     {
  699.     if INSERT=0 then
  700.         {
  701.         pokeb COMMAND+TX,KK
  702.         TX++
  703.         if TX>TYPED then TYPED=TX
  704.         }
  705.     else
  706.         {
  707.         INSERT_CHAR(KK)
  708.         TYPED++
  709.         }
  710.     }
  711.     }
  712. }
  713. ENDCOMMAND:
  714. move 32 from COMMAND to PREVIOUS
  715. LAST_TYPED=TYPED
  716.  
  717. ANY_ERRORS=0
  718. cursor 32,0
  719. locate 24,0
  720. for X=COMMAND to COMMAND+63:pokeb X,ucase peekb X:next X
  721. WAITING=0  ;Say not line skip.
  722.  
  723. print
  724. C1=peekb COMMAND
  725. C2=peekb (COMMAND+1)
  726. C3=peekb (COMMAND+2)
  727. C4=peekb (COMMAND+3)
  728.  
  729. if C1='?' then
  730.     {
  731.     LINES=1
  732.     ADDRESS=HELP_TEXT
  733.     while peekb ADDRESS
  734.     {
  735.     if peekb ADDRESS=13 then
  736.         {
  737.         if BOXING and (LINES=16) then
  738.         {
  739.         wait for keypressed
  740.         LINES=0
  741.         K=key:if K=27 then print:goto GNULL
  742.         }
  743.         LINES++
  744.         print
  745.         }
  746.     else print chr peek ADDRESS;
  747.     ADDRESS++
  748.     }
  749.     goto GNULL
  750.     }
  751.  
  752. F=searchb 15 from KEY_TABLE for C1
  753. WAITFKEY=1
  754.  
  755. POSITION=COMMAND+1  ;Current scan position, used for evaluation.
  756. if F then
  757.     {
  758.     F-=KEY_TABLE
  759.     call peek (KEY_ADDR+F*2)
  760.     }
  761. else
  762.     {
  763.     WHAT_KEY:
  764.     print "What?"
  765.     }
  766. GNULL:
  767. goto MAIN
  768.  
  769. SCRCHK:
  770. pushall
  771. push reg ax
  772. reg ds=reg cs
  773. pop AX
  774. RT=reg cx:RB=reg dx
  775.  
  776. if AX=0601h then OUTPUT_LINE
  777. if BOXING and (AX=0601h) and (RT=0) and (RB=184fh) then
  778.     {
  779.     popall
  780.     push reg ax
  781.     reg cx=0900h
  782.     reg dx=1844h
  783.     inline 58h
  784.     pushall
  785.     }
  786.  
  787. popall
  788. inline 0eah
  789. SOFF:
  790. data 0
  791. SSEG:
  792. data 0
  793.  
  794. FILENAME:
  795. string 64
  796.  
  797. REG_DISPLAY:
  798. datab 'AX','CX','DX','BX','SP','BP','SI','DI','ES','CS','SS','DS','IP'
  799.  
  800. REGISTERS:
  801. data 0,0,0,0
  802. data 65535,0,0,0
  803. REGSEGS:
  804. data 0,0,0,0
  805. REG_IP:
  806. data 100h
  807.  
  808. OUTPUT_FILE:
  809. string 40
  810.  
  811. DEFAULT_DISK:
  812. fname 'DC.LST'
  813.  
  814. REGW:
  815. datab 'AXCXDXBXSPBPSIDI'
  816.  
  817. REGB:
  818. datab 'ALCLDLBLAHCHDHBH'
  819.  
  820. SEG:
  821. datab 'ESCSSSDS'
  822.  
  823. GROUP1:
  824. data I_TEST
  825. data I_NULL
  826. data I_NOT
  827. data I_NEG
  828. data I_MUL
  829. data I_IMUL
  830. data I_DIV
  831. data I_IDIV
  832.  
  833. GROUP2:
  834. data I_INC
  835. data I_DEC
  836. data I_CALL
  837. data I_CALLF
  838. data I_JUMP
  839. data I_JMPF
  840. data I_PUSH
  841. data I_NULL
  842.  
  843. SHIFT:
  844. data I_ROL
  845. data I_ROR
  846. data I_RCL
  847. data I_RCR
  848. data I_SHL
  849. data I_SHR
  850. data I_NULL
  851. data I_SAR
  852.  
  853. IMMED:
  854. data I_ADD
  855. data I_OR
  856. data I_ADC
  857. data I_SBB
  858. data I_AND
  859. data I_SUB
  860. data I_XOR
  861. data I_CMP
  862.  
  863. TABLE_RM:
  864. datab 0,'BX+SI',255
  865. datab 1,'BX+DI',255
  866. datab 2,'BP+SI',255
  867. datab 3,'BP+DI',255
  868. datab 4,'SI',255
  869. datab 5,'DI',255
  870. datab 6,'BP',255
  871. datab 7,'BX',255
  872.  
  873.  
  874. KEY_TABLE:
  875. datab 'UGDRIOQTECSFMPV'
  876.  
  877. KEY_ADDR:
  878. data KEY_UNASM,GNULL,KEY_DUMP,GNULL
  879. data KEY_INPUT,KEY_OUTPUT,KEY_QUIT,GNULL
  880. data KEY_ENTER,KEY_COMP,KEY_SEARCH,GNULL
  881. data KEY_MOVE,GNULL,KEY_VERSION
  882.  
  883. HELP_TEXT:
  884. datab 13
  885. datab 'DC (DEBUG CONTROL) WRITTEN BY PETER CAMPBELL',13
  886. datab 13
  887. datab 'C    - source count destination (compare blocks of memory)',13
  888. datab 'CLS  - (clear screen, full screen mode)',13
  889. datab 'D    - start finish (dump memory in hex and ascii)',13
  890. datab 'DRAW - (draw box, half screen mode)',13
  891. datab 'E    - start (enter bytes from address)',13
  892. datab 'F    - start repeat string/bytes (fill memory)',13
  893. datab 'G    - breakpoint,=address (go to address)',13
  894. datab 'I    - port (input byte from port)',13
  895. datab 'IO   - (update current I/O settings)',13
  896. datab 'M    - source count destination (move memory)',13
  897. datab 'O    - port byte (output byte to port)',13
  898. datab 'P    - (proceed, execute one instruction)',13
  899. datab 'Q    - (quit DC)',13
  900. datab 'R    - register (set/display register contents)',13
  901. datab 'S    - start count string/bytes (search for bytes)',13
  902. datab 'T    - count (trace instructions)',13
  903. datab 'U    - start finish (unassemble)',13
  904. datab 'V    - (version?)',13
  905. datab 0
  906.  
  907. KEY_QUIT:
  908. END_IT_ALL
  909.  
  910. KEY_DUMP:
  911. if (C2='R') and (C3='A') and (C4='W') then
  912.     {
  913.     BOXING=1
  914.     locate 0,0:print " ";
  915.     return
  916.     }
  917. NEW_SEG(CUR_DS,CUR_DX):if ANY_ERRORS then return
  918. CUR_DS=NEWS:CUR_DX=NEWO and 65520
  919.  
  920. SKIP
  921. FINISH=HEX_NUMBER(65535):if ANY_ERRORS then return
  922.  
  923. DUMP_FUNC:
  924. NSCR=0:OLD_NSCR=0
  925. forever
  926. {
  927. if not NSCR then
  928.     {
  929.     if OLD_NSCR then print
  930.     DUMP_HEX(CUR_DS,CUR_DX)
  931.     OLD_NSCR=0
  932.     CUR_DX+=16
  933.     print
  934.     if ENDED then return
  935.     }
  936. NSCR=0
  937. if WAIT_KEY then return
  938. if KS=18432 then CUR_DX-=272
  939. if KS=20480 then CUR_DX-=240
  940. if KS=18688 then CUR_DX-=512
  941. if (KS=18432) or (KS=20480) or (KS=20736) or (KS=18688) then
  942.     {
  943.     NSCR=1
  944.     locate 9,0
  945.     for L=1 to 16
  946.     DUMP_HEX(CUR_DS,CUR_DX):CUR_DX+=16
  947.     if L<>16 then print
  948.     next L
  949.     OLD_NSCR=1
  950.     }
  951. }
  952.  
  953. KEY_COMP:
  954. if (C2='L') and (C3='S') then cls:BOXING=0:return
  955. if END_LINE then print "Compare what?":return
  956. NEW_SEG(CUR_DS,0):if ANY_ERRORS then return
  957. CDS=NEWS:CDX=NEWO
  958. if END_LINE then print "How many?":return
  959. COUNT=HEX_NUMBER(0):if ANY_ERRORS then return
  960. if END_LINE then print "With what?":return
  961. NEW_SEG(CUR_DS,0):if ANY_ERRORS then return
  962. CES=NEWS:CEX=NEWO
  963. DIFFERENCES=0
  964.  
  965. while COUNT
  966.     {
  967.     F=compareb COUNT at CDS|CDX with CES|CEX
  968.     if (F<>0) or ((CDX=0) and (CDS[CDX]b<>CES[CEX]b)) then
  969.     {
  970.     COUNT-=F-CDX+1
  971.     CEX+=F-CDX:CDX=F
  972.     printh CDS":"CDX" ";
  973.     printhb CDS[CDX]"    ";
  974.     printh CES":"CEX" ";
  975.     printhb CES[CEX]
  976.     DIFFERENCES++:CDX++:CEX++
  977.     if WAIT_KEY then return
  978.     }
  979.     else goto PRINT_DIFF
  980.     }
  981. PRINT_DIFF:
  982. print DIFFERENCES" differences."
  983. return
  984.  
  985. KEY_INPUT:
  986. if C2='O' then goto KEY_IO
  987. SKIP
  988. PORT=HEX_NUMBER(65535):if ANY_ERRORS then return
  989. if PORT=65535 then print "Port?":return
  990. I=in PORT
  991. printhb I;"H (";
  992. printb I;")"
  993. return
  994.  
  995. KEY_IO:
  996. IO_OUT=0
  997. print
  998. print "Current output -"
  999. colour 15
  1000. if DISK_OUTPUT then
  1001.     {
  1002.     print "  Disk file: ";
  1003.     M=OUTPUT_FILE+2
  1004.     while peekb M print chr lcase peek M;:M++
  1005.     print
  1006.     }
  1007. if PRINTER_OUTPUT then print "  Printer."
  1008. if SCROLLF then print "  Screen."
  1009. colour 7
  1010.  
  1011. print cr "Press D to turn disk output ";
  1012. PRINT_OO(not DISK_OUTPUT):print ","
  1013. print "      P to turn printer output ";
  1014. PRINT_OO(not PRINTER_OUTPUT):print ","
  1015. print "      S to turn screen output ";
  1016. PRINT_OO(not SCROLLF):print ".";:loctocur
  1017.  
  1018. wait for keypressed
  1019. print cr
  1020. K=ucase key
  1021. if K='D' then
  1022.     {
  1023.     DISK_OUTPUT=not DISK_OUTPUT
  1024.     if DISK_OUTPUT then
  1025.     {
  1026.     loctocur
  1027.     print bios "Disk file name: [DC.LST] ";
  1028.     inputs OUTPUT_FILE
  1029.     print
  1030.     if not peekb (OUTPUT_FILE+2)
  1031.         then moveb 7 from DEFAULT_DISK to OUTPUT_FILE+2
  1032.  
  1033.     create #5,OUTPUT_FILE+2
  1034.     if error then print "Can't open file!":beep:DISK_OUTPUT=0
  1035.     DPLACE=DISK_START
  1036.     }
  1037.     else CLOSE5:if error then print "Error closing disk file!":beep
  1038.     goto KEY_IO
  1039.     }
  1040. if K='P' then
  1041.     {
  1042.     PRINTER_OUTPUT=not PRINTER_OUTPUT
  1043.     goto KEY_IO
  1044.     }
  1045. if K='S' then
  1046.     {
  1047.     SCROLLF=not SCROLLF
  1048.     goto KEY_IO
  1049.     }
  1050. IO_OUT=1
  1051. return
  1052.  
  1053. KEY_OUTPUT:
  1054. SKIP
  1055. PORT=HEX_NUMBER(65535):if ANY_ERRORS then return
  1056. if PORT=65535 then print "Port?":return
  1057. SKIP
  1058. O=HEX_NUMBER(1000):if ANY_ERRORS then return
  1059. if O=1000 then print "Out what?":return
  1060. out PORT,O
  1061. print "Done."
  1062. return
  1063.  
  1064. KEY_ENTER:
  1065. NEW_SEG(CUR_DS,CUR_DX):if ANY_ERRORS then return
  1066. forever
  1067. {
  1068. printh NEWS;":";NEWO;"  ";
  1069. printhb NEWS[NEWO];" - ";
  1070. PV=0:CH=0:OLDO=NEWO
  1071.  
  1072. GET_ENTER:
  1073. loctocur
  1074. cursor high curpos,low curpos+CH
  1075. wait for keypressed
  1076. KS=keyscan:K=ucase low KS
  1077. if K=27 then print:return
  1078. if KS=18432 then NEWO--
  1079. if KS=20480 then NEWO++
  1080. if K=13 then
  1081.     {
  1082.     if CH then NEWS[NEWO]b=PV
  1083.     NEWO++
  1084.     }
  1085. if KS=3592 then CH=0:print "  ";:locpos-=4
  1086.  
  1087. PRT=K
  1088. K-='0'
  1089. if K>9 then K-=7
  1090. if (CH<2) and (K>=0) and (K<16) then
  1091.     {
  1092.     print bios chr PRT;:CH++
  1093.     PV=PV*16+K
  1094.     }
  1095. if NEWO=OLDO then goto GET_ENTER
  1096. print
  1097. }
  1098.  
  1099. KEY_MOVE:
  1100. if END_LINE then print "Move what?":return
  1101. NEW_SEG(CUR_DS,0):if ANY_ERRORS then return
  1102. CDS=NEWS:CDX=NEWO
  1103. if END_LINE then print "How many?":return
  1104. COUNT=HEX_NUMBER(0):if ANY_ERRORS then return
  1105. if END_LINE then print "Move where?":return
  1106. NEW_SEG(CUR_DS,0):if ANY_ERRORS then return
  1107. CES=NEWS:CEX=NEWO
  1108.  
  1109. moveb COUNT from CDS|CDX to CES|CEX
  1110. print "Moved."
  1111. return
  1112.  
  1113. KEY_UNASM:
  1114. NEW_SEG(CUR_CS,CUR_IP):if ANY_ERRORS then return
  1115. CUR_CS=NEWS:CUR_IP=NEWO
  1116. SKIP
  1117. FINISH=HEX_NUMBER(CUR_IP+UNASM_SCREEN):if ANY_ERRORS then return
  1118.  
  1119. UNASM_FUNC:
  1120. SYMBOLS=0:OSF=SCROLLF:SCROLLF=0
  1121. GET_SYMBOL=1
  1122. ORG_IP=CUR_IP
  1123. while (CUR_IP below FINISH) and (SYMBOLS<MAX_SYMBOLS)
  1124.     {
  1125.     locate 24,0:printh chr '-';FINISH-CUR_IP;" ";
  1126.     CUR_IP=UNASSEMBLE(CUR_CS,CUR_IP)
  1127.     }
  1128.  
  1129. locate 24,0:UNASM_CLINE:locate 24,0
  1130.  
  1131. GET_SYMBOL=0
  1132. SCROLLF=OSF
  1133. CUR_IP=ORG_IP
  1134. while CUR_IP below FINISH
  1135.     {
  1136.     CUR_IP=UNASSEMBLE(CUR_CS,CUR_IP)
  1137.     if WAIT_KEY then return
  1138.     }
  1139. return
  1140.  
  1141. STATUS:
  1142. print "DC Options -"
  1143. print "Unassemble in hex? [";chr 'N'+11*HEX;"] ";
  1144. HEX=YESNO(HEX)
  1145. print "Scroll delay? (0-5) [";chr DELAY+'0'"] ";
  1146. loctocur
  1147.  
  1148. GET_DELAY:
  1149. wait for keypressed
  1150. K=key:if K=13 then print:goto NEXT_STAT
  1151. if (K<'0') or (K>'5') then goto GET_DELAY
  1152. DELAY=K-'0'
  1153. print chr K
  1154.  
  1155. NEXT_STAT:
  1156. print "Filter ascii dump? ["chr FILTER*11+'N'"] ";
  1157. FILTER=YESNO(FILTER)
  1158. return
  1159.  
  1160.  
  1161. KEY_SEARCH:
  1162. return
  1163.  
  1164. KEY_VERSION:
  1165. print cr"DC (DEBUG CONTROL) WRITTEN BY PETER CAMPBELL"
  1166. print "Version 1.55 (19/7/88)"cr
  1167. return
  1168.  
  1169.  
  1170. ;Disassembly tables.
  1171. FIRST_MESSAGE:
  1172.  
  1173. I_XLAT:
  1174. fname 'XLAT'
  1175. I_RET:
  1176. fname 'RET'
  1177. I_LAHF:
  1178. fname 'LAHF'
  1179. I_SAHF:
  1180. fname 'SAHF'
  1181. I_POPF:
  1182. fname 'POPF'
  1183. I_PUSHF:
  1184. fname 'PUSHF'
  1185. I_AAA:
  1186. fname 'AAA'
  1187. I_DAA:
  1188. fname 'DAA'
  1189. I_AAS:
  1190. fname 'AAS'
  1191. I_DAS:
  1192. fname 'DAS'
  1193. I_CBW:
  1194. fname 'CBW'
  1195. I_CWD:
  1196. fname 'CWD'
  1197. I_MOVSB:
  1198. fname 'MOVSB'
  1199. I_MOVSW:
  1200. fname 'MOVSW'
  1201. I_STOSB:
  1202. fname 'STOSB'
  1203. I_STOSW:
  1204. fname 'STOSW'
  1205. I_LODSB:
  1206. fname 'LODSB'
  1207. I_LODSW:
  1208. fname 'LODSW'
  1209. I_SCASB:
  1210. fname 'SCASB'
  1211. I_SCASW:
  1212. fname 'SCASW'
  1213. I_CMPSB:
  1214. fname 'CMPSB'
  1215. I_CMPSW:
  1216. fname 'CMPSW'
  1217. I_REPNZ:
  1218. fname 'REPNZ'
  1219. I_REPZ:
  1220. fname 'REPZ'
  1221. I_RETF:
  1222. fname 'RETF'
  1223. I_INT3:
  1224. fname 'INT 3'
  1225. I_INTO:
  1226. fname 'INTO'
  1227. I_IRET:
  1228. fname 'IRET'
  1229. I_CLC:
  1230. fname 'CLC'
  1231. I_STC:
  1232. fname 'STC'
  1233. I_CMC:
  1234. fname 'CMC'
  1235. I_NOP:
  1236. fname 'NOP'
  1237. I_CLD:
  1238. fname 'CLD'
  1239. I_STD:
  1240. fname 'STD'
  1241. I_CLI:
  1242. fname 'CLI'
  1243. I_STI:
  1244. fname 'STI'
  1245. I_HLT:
  1246. fname 'HLT'
  1247. I_WAIT:
  1248. fname 'WAIT'
  1249. I_LOCK:
  1250. fname 'LOCK'
  1251. I_INT:
  1252. fname 'INT'
  1253. I_CALL:
  1254. fname 'CALL'
  1255. I_JUMP:
  1256. fname 'JMP'
  1257. I_DB:
  1258. fname 'DB'
  1259. I_JE:
  1260. fname 'JE'
  1261. I_JL:
  1262. fname 'JL'
  1263. I_JLE:
  1264. fname 'JLE'
  1265. I_JB:
  1266. fname 'JB'
  1267. I_JBE:
  1268. fname 'JBE'
  1269. I_JP:
  1270. fname 'JP'
  1271. I_JO:
  1272. fname 'JO'
  1273. I_JS:
  1274. fname 'JS'
  1275. I_JNE:
  1276. fname 'JNE'
  1277. I_JNL:
  1278. fname 'JNL'
  1279. I_JG:
  1280. fname 'JG'
  1281. I_JAE:
  1282. fname 'JAE'
  1283. I_JA:
  1284. fname 'JA'
  1285. I_JPO:
  1286. fname 'JPO'
  1287. I_JNO:
  1288. fname 'JNO'
  1289. I_JNS:
  1290. fname 'JNS'
  1291. I_LOOP:
  1292. fname 'LOOP'
  1293. I_LOOPZ:
  1294. fname 'LOOPZ'
  1295. I_LOOPNZ:
  1296. fname 'LOOPNZ'
  1297. I_JCXZ:
  1298. fname 'JCXZ'
  1299. I_PUSH:
  1300. fname 'PUSH'
  1301. I_POP:
  1302. fname 'POP'
  1303. I_XCHG:
  1304. fname 'XCHG'
  1305. I_INC:
  1306. fname 'INC'
  1307. I_DEC:
  1308. fname 'DEC'
  1309. I_IN:
  1310. fname 'IN'
  1311. I_OUT:
  1312. fname 'OUT'
  1313. I_ADC:
  1314. fname 'ADC'
  1315. I_ADD:
  1316. fname 'ADD'
  1317. I_SUB:
  1318. fname 'SUB'
  1319. I_SBB:
  1320. fname 'SBB'
  1321. I_CMP:
  1322. fname 'CMP'
  1323. I_AND:
  1324. fname 'AND'
  1325. I_TEST:
  1326. fname 'TEST'
  1327. I_OR:
  1328. fname 'OR'
  1329. I_XOR:
  1330. fname 'XOR'
  1331. I_MOV:
  1332. fname 'MOV'
  1333. I_JMPF:
  1334. fname 'JMPF'
  1335. I_CALLF:
  1336. fname 'CALLF'
  1337. I_JMPS:
  1338. fname 'JMPS'
  1339. I_LEA:
  1340. fname 'LEA'
  1341. I_LDS:
  1342. fname 'LDS'
  1343. I_LES:
  1344. fname 'LES'
  1345. I_NOT:
  1346. fname 'NOT'
  1347. I_NEG:
  1348. fname 'NEG'
  1349. I_MUL:
  1350. fname 'MUL'
  1351. I_IMUL:
  1352. fname 'IMUL'
  1353. I_DIV:
  1354. fname 'DIV'
  1355. I_IDIV:
  1356. fname 'IDIV'
  1357. I_ROL:
  1358. fname 'ROL'
  1359. I_ROR:
  1360. fname 'ROR'
  1361. I_RCL:
  1362. fname 'RCL'
  1363. I_RCR:
  1364. fname 'RCR'
  1365. I_SHL:
  1366. fname 'SHL'
  1367. I_SHR:
  1368. fname 'SHR'
  1369. I_SAR:
  1370. fname 'SAR'
  1371. I_AAD:
  1372. fname 'AAD'
  1373. I_AAM:
  1374. fname 'AAM'
  1375.  
  1376. I_NULL:
  1377. fname '*What?*'
  1378. I_SPACE:
  1379. fname ''
  1380.  
  1381. LAST_MESSAGE:
  1382.  
  1383.  
  1384. LOOKUP_CODES:
  1385. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;0
  1386. data R_ADD,R_ADD,R_PUSHS,R_POPS ;4
  1387. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;8
  1388. data R_OR,R_OR,R_PUSHS,0 ;12
  1389. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;16
  1390. data R_ADC,R_ADC,R_PUSHS,R_POPS ;20
  1391. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;24
  1392. data R_SBB,R_SBB,R_PUSHS,R_POPS ;28
  1393.  
  1394. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;32
  1395. data R_AND,R_AND,R_OVERS,I_DAA ;36
  1396. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;40
  1397. data R_SUB,R_SUB,R_OVERS,I_DAS ;44
  1398. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;48
  1399. data R_XOR,R_XOR,R_OVERS,I_AAA ;52
  1400. data R_IMMED,R_IMMED,R_IMMED,R_IMMED ;56
  1401. data R_CMP,R_CMP,R_OVERS,I_AAS ;60
  1402.  
  1403. data R_INC,R_INC,R_INC,R_INC ;64
  1404. data R_INC,R_INC,R_INC,R_INC ;68
  1405. data R_DEC,R_DEC,R_DEC,R_DEC ;72
  1406. data R_DEC,R_DEC,R_DEC,R_DEC ;76
  1407. data R_PUSH,R_PUSH,R_PUSH,R_PUSH ;80
  1408. data R_PUSH,R_PUSH,R_PUSH,R_PUSH ;84
  1409. data R_POP,R_POP,R_POP,R_POP ;88
  1410. data R_POP,R_POP,R_POP,R_POP ;92
  1411.  
  1412. data 0,0,0,0 ;96
  1413. data 0,0,0,0 ;100
  1414. data 0,0,0,0 ;104
  1415. data 0,0,0,0 ;108
  1416. data R_JO,R_JNO,R_JB,R_JAE ;112
  1417. data R_JE,R_JNE,R_JBE,R_JA ;116
  1418. data R_JS,R_JNS,R_JP,R_JPO ;120
  1419. data R_JL,R_JNL,R_JLE,R_JG ;124
  1420.  
  1421. data R_IMMEDI,R_IMMEDI,R_IMMEDI,R_IMMEDI ;128
  1422. data R_TESTW,R_TESTW,R_XCHGW,R_XCHGW ;132
  1423. data R_MOVR,R_MOVR,R_MOVR,R_MOVR ;136
  1424. data R_MOVST,R_LEA,R_MOVTS,R_POPRM ;140
  1425. data I_NOP,R_XCHG,R_XCHG,R_XCHG ;144
  1426. data R_XCHG,R_XCHG,R_XCHG,R_XCHG ;148
  1427. data I_CBW,I_CWD,R_CALLF,I_WAIT ;152
  1428. data I_PUSHF,I_POPF,I_SAHF,I_LAHF ;156
  1429.  
  1430. data R_MOVMA,R_MOVMA,R_MOVAM,R_MOVAM ;160
  1431. data I_MOVSB,I_MOVSW,I_CMPSB,I_CMPSW ;164
  1432. data R_TEST,R_TEST,I_STOSB,I_STOSW ;168
  1433. data I_LODSB,I_LODSW,I_SCASB,I_SCASW ;172
  1434. data R_MOVIR,R_MOVIR,R_MOVIR,R_MOVIR ;176
  1435. data R_MOVIR,R_MOVIR,R_MOVIR,R_MOVIR ;180
  1436. data R_MOVIR,R_MOVIR,R_MOVIR,R_MOVIR ;184
  1437. data R_MOVIR,R_MOVIR,R_MOVIR,R_MOVIR ;188
  1438.  
  1439. data 0,0,R_RETSP,I_RET ;192
  1440. data R_LES,R_LDS,R_MOVIRM,R_MOVIRM ;196
  1441. data 0,0,R_RETFSP,I_RETF ;200
  1442. data I_INTO,R_INT,I_INTO,I_IRET ;204
  1443. data R_SHIFT,R_SHIFT,R_SHIFT,R_SHIFT ;208
  1444. data R_AAM,R_AAD,0,I_XLAT ;212
  1445. data 0,0,0,0 ;216
  1446. data 0,0,0,0 ;220
  1447.  
  1448. data R_LOOPNZ,R_LOOPZ,R_LOOP,R_JCXZ ;224
  1449. data R_INP,R_INP,R_OUTP,R_OUTP ;228
  1450. data R_CALL,R_JUMP,R_JMPF,R_JMPS ;232
  1451. data R_INDX,R_INDX,R_OUTDX,R_OUTDX ;236
  1452. data I_LOCK,0,I_REPNZ,I_REPZ ;240
  1453. data I_HLT,I_CMC,R_MATH,R_MATH ;244
  1454. data I_CLC,I_STC,I_CLI,I_STI ;248
  1455. data I_CLD,I_STD,R_GROUP2,R_GROUP2 ;252
  1456.  
  1457.  
  1458. R_INT:
  1459. PRINT_8088(I_INT)
  1460. R_BYTE:
  1461. PRINT_BYTE(CS[IP+1])
  1462. IP+=2
  1463. return
  1464.  
  1465. R_RETSP:
  1466. PRINT_8088(I_RET)
  1467. R_WORD:
  1468. PRINT_WORD(CS[IP+1])
  1469. IP+=3
  1470. return
  1471.  
  1472. R_RETFSP:
  1473. PRINT_8088(I_RETF)
  1474. goto R_WORD
  1475.  
  1476. R_CALL:
  1477. PRINT_8088(I_CALL)
  1478. R_NEAR:
  1479. IA=CS[IP+1]:IP+=3
  1480. if IA>=0 then IA+=IP else IA=IP-(0-IA)
  1481. PRINT_ADDRESS(IA)
  1482. return
  1483.  
  1484. R_JUMP:
  1485. PRINT_8088(I_JUMP)
  1486. goto R_NEAR
  1487.  
  1488. R_JE:
  1489. PRINT_8088(I_JE)
  1490. PRINT_OFFSET:
  1491. OFS=CS[IP+1]b
  1492. IP+=2
  1493. if OFS<128
  1494.     then PRINT_ADDRESS(IP+OFS)
  1495.     else PRINT_ADDRESS(IP-(256-OFS))
  1496. return
  1497.  
  1498. R_JL:
  1499. PRINT_8088(I_JL)
  1500. goto PRINT_OFFSET
  1501.  
  1502. R_JLE:
  1503. PRINT_8088(I_JLE)
  1504. goto PRINT_OFFSET
  1505.  
  1506. R_JB:
  1507. PRINT_8088(I_JB)
  1508. goto PRINT_OFFSET
  1509.  
  1510. R_JBE:
  1511. PRINT_8088(I_JBE)
  1512. goto PRINT_OFFSET
  1513.  
  1514. R_JP:
  1515. PRINT_8088(I_JP)
  1516. goto PRINT_OFFSET
  1517.  
  1518. R_JO:
  1519. PRINT_8088(I_JO)
  1520. goto PRINT_OFFSET
  1521.  
  1522. R_JS:
  1523. PRINT_8088(I_JS)
  1524. goto PRINT_OFFSET
  1525.  
  1526. R_JNE:
  1527. PRINT_8088(I_JNE)
  1528. goto PRINT_OFFSET
  1529.  
  1530. R_JNL:
  1531. PRINT_8088(I_JNL)
  1532. goto PRINT_OFFSET
  1533.  
  1534. R_JG:
  1535. PRINT_8088(I_JG)
  1536. goto PRINT_OFFSET
  1537.  
  1538. R_JAE:
  1539. PRINT_8088(I_JAE)
  1540. goto PRINT_OFFSET
  1541.  
  1542. R_JA:
  1543. PRINT_8088(I_JA)
  1544. goto PRINT_OFFSET
  1545.  
  1546. R_JPO:
  1547. PRINT_8088(I_JPO)
  1548. goto PRINT_OFFSET
  1549.  
  1550. R_JMPS:
  1551. PRINT_8088(I_JMPS)
  1552. goto PRINT_OFFSET
  1553.  
  1554. R_JNO:
  1555. PRINT_8088(I_JNO)
  1556. goto PRINT_OFFSET
  1557.  
  1558. R_JNS:
  1559. PRINT_8088(I_JNS)
  1560. goto PRINT_OFFSET
  1561.  
  1562. R_LOOP:
  1563. PRINT_8088(I_LOOP)
  1564. goto PRINT_OFFSET
  1565.  
  1566. R_LOOPZ:
  1567. PRINT_8088(I_LOOPZ)
  1568. goto PRINT_OFFSET
  1569.  
  1570. R_LOOPNZ:
  1571. PRINT_8088(I_LOOPNZ)
  1572. goto PRINT_OFFSET
  1573.  
  1574. R_JCXZ:
  1575. PRINT_8088(I_JCXZ)
  1576. goto PRINT_OFFSET
  1577.  
  1578. R_PUSH:
  1579. PRINT_8088(I_PUSH)
  1580. PRINT_LOW_REGW:
  1581. PRINT_REG(REGW,BYTE)
  1582. IP++
  1583. return
  1584.  
  1585. R_POP:
  1586. PRINT_8088(I_POP)
  1587. goto PRINT_LOW_REGW
  1588.  
  1589. R_XCHG:
  1590. PRINT_8088(I_XCHG)
  1591. print "AX,";
  1592. goto PRINT_LOW_REGW
  1593.  
  1594. R_INC:
  1595. PRINT_8088(I_INC)
  1596. goto PRINT_LOW_REGW
  1597.  
  1598. R_DEC:
  1599. PRINT_8088(I_DEC)
  1600. goto PRINT_LOW_REGW
  1601.  
  1602. R_POPS:
  1603. PRINT_8088(I_POP)
  1604. PRINT_MID_SEG:
  1605. PRINT_REG(SEG,BYTE/8)
  1606. IP++
  1607. return
  1608.  
  1609. R_PUSHS:
  1610. PRINT_8088(I_PUSH)
  1611. goto PRINT_MID_SEG
  1612.  
  1613. R_INP:
  1614. PRINT_8088(I_IN)
  1615. PRINT_W(BYTE)
  1616. print ",";
  1617. goto R_BYTE
  1618.  
  1619. R_OUTP:
  1620. PRINT_8088(I_OUT)
  1621. gosub R_BYTE
  1622. print ",";
  1623. PRINT_W(BYTE)
  1624. return
  1625.  
  1626. R_INDX:
  1627. PRINT_8088(I_IN)
  1628. PRINT_W(BYTE)
  1629. print ",DX";
  1630. IP++
  1631. return
  1632.  
  1633. R_OUTDX:
  1634. PRINT_8088(I_OUT)
  1635. print "DX,";
  1636. PRINT_W(BYTE)
  1637. IP++
  1638. return
  1639.  
  1640. R_ADC:
  1641. PRINT_8088(I_ADC)
  1642. R_WDW1:
  1643. PRINT_W(BYTE)
  1644. print ",";
  1645. WDW1:
  1646. if BYTE and 1
  1647.     then PRINT_WORD(CS[IP+1]):IP+=3
  1648.     else PRINT_BYTE(CS[IP+1]):IP+=2
  1649. return
  1650.  
  1651. R_ADD:
  1652. PRINT_8088(I_ADD)
  1653. goto R_WDW1
  1654.  
  1655. R_SUB:
  1656. PRINT_8088(I_SUB)
  1657. goto R_WDW1
  1658.  
  1659. R_SBB:
  1660. PRINT_8088(I_SBB)
  1661. goto R_WDW1
  1662.  
  1663. R_CMP:
  1664. PRINT_8088(I_CMP)
  1665. goto R_WDW1
  1666.  
  1667. R_AND:
  1668. PRINT_8088(I_AND)
  1669. goto R_WDW1
  1670.  
  1671. R_TEST:
  1672. PRINT_8088(I_TEST)
  1673. goto R_WDW1
  1674.  
  1675. R_OR:
  1676. PRINT_8088(I_OR)
  1677. goto R_WDW1
  1678.  
  1679. R_XOR:
  1680. PRINT_8088(I_XOR)
  1681. goto R_WDW1
  1682.  
  1683. R_MOVMA:
  1684. PRINT_8088(I_MOV)
  1685. PRINT_W(BYTE)
  1686. print ",[";
  1687. PRINT_WORD(CS[IP+1])
  1688. print "]";
  1689. IP+=3
  1690. return
  1691.  
  1692. R_MOVAM:
  1693. PRINT_8088(I_MOV)
  1694. print "[";
  1695. PRINT_WORD(CS[IP+1])
  1696. print "],";
  1697. PRINT_W(BYTE)
  1698. IP+=3
  1699. return
  1700.  
  1701. R_CALLF:
  1702. PRINT_8088(I_CALLF)
  1703. PRINT_ABS:
  1704. printh CS[IP+1];"h:";CS[IP+3];"h";
  1705. IP+=5
  1706. return
  1707.  
  1708. R_JMPF:
  1709. PRINT_8088(I_JMPF)
  1710. goto PRINT_ABS
  1711.  
  1712. R_LEA:
  1713. PRINT_8088(I_LEA)
  1714. R_MRD:
  1715. BYTE=CS[IP+1]b
  1716. PRINT_REG(REGW,BYTE/8)
  1717. R_MRM:
  1718. BYTE=CS[IP+1]b
  1719. print ",";
  1720. MRM2:
  1721. IP+=2
  1722. PRINT_MRM(BYTE,1)
  1723. return
  1724.  
  1725. R_LDS:
  1726. PRINT_8088(I_LDS)
  1727. goto R_MRD
  1728.  
  1729. R_LES:
  1730. PRINT_8088(I_LES)
  1731. goto R_MRD
  1732.  
  1733. R_XCHGW:
  1734. PRINT_8088(I_XCHG)
  1735. REGT=REGB:if BYTE and 1 then REGT=REGW
  1736. BYTE=CS[IP+1]b
  1737. PRINT_REG(REGT,BYTE/8)
  1738. goto R_MRM
  1739.  
  1740. R_MATH:
  1741. SECI=CS[IP+1]b
  1742. SECM=peek(GROUP1+((SECI/8) and 7)*2)
  1743. if SECM=I_NULL then goto NULL_CONTINUE
  1744. PRINT_8088W(SECM)
  1745. IP+=2
  1746. PRINT_MRM(SECI,BYTE)
  1747. if SECM=I_TEST then
  1748.     {
  1749.     print ",";
  1750.     PRINT_WORD(CS[IP])
  1751.     IP+=2
  1752.     }
  1753. return
  1754.  
  1755. R_SHIFT:
  1756. SECI=CS[IP+1]b
  1757. SECM=peek(SHIFT+((SECI/8) and 7)*2)
  1758. if SECM=I_NULL then goto NULL_CONTINUE
  1759. PRINT_8088W(SECM)
  1760. IP+=2
  1761. PRINT_MRM(SECI,BYTE)
  1762. if BYTE and 2 then print ",CL"; else print ",1";
  1763. return
  1764.  
  1765. R_GROUP2:
  1766. SECI=CS[IP+1]b
  1767. SECM=peek(GROUP2+((SECI/8) and 7)*2)
  1768. if SECM=I_NULL then goto NULL_CONTINUE
  1769. if (SECM=I_DEC) or (SECM=I_INC)
  1770.     then PRINT_8088W(SECM)
  1771.     else PRINT_8088(SECM)
  1772. IP+=2
  1773. PRINT_MRM(SECI,BYTE)
  1774. return
  1775.  
  1776. R_IMMED:
  1777. PRINT_8088W(peek(IMMED+2*((BYTE/8) and 7)))
  1778. MOVR2:
  1779. REGT=REGB:if BYTE and 1 then REGT=REGW
  1780. REGS=CS[IP+1]b
  1781. IP+=2
  1782. if BYTE and 2 then
  1783.     {
  1784.     PRINT_REG(REGT,REGS/8)
  1785.     print ",";
  1786.     PRINT_MRM(REGS,BYTE)
  1787.     }
  1788. else
  1789.     {
  1790.     PRINT_MRM(REGS,BYTE)
  1791.     print ",";
  1792.     PRINT_REG(REGT,REGS/8)
  1793.     }
  1794. return
  1795.  
  1796. R_POPRM:
  1797. BYTE=CS[IP+1]b
  1798. if BYTE and 111000b then goto NULL_CONTINUE
  1799. PRINT_8088(I_POP)
  1800. goto MRM2
  1801.  
  1802. R_IMMEDI:
  1803. REGS=CS[IP+1]b
  1804. PRINT_8088W(peek(IMMED+2*((REGS/8) and 7)))
  1805. IP+=2
  1806. PRINT_MRM(REGS,BYTE)
  1807. print ",";
  1808. SW=BYTE and 3
  1809. IA=CS[IP]b:IP++
  1810. if SW=1 then IA=CS[IP-1]:IP++
  1811. if SW=3 then if IA>127 then IA=0-(256-IA)
  1812. PRINT_WORD(IA)
  1813. return
  1814.  
  1815. R_AAM:
  1816. PRINT_8088(I_AAM)
  1817. PBAA:
  1818. PRINT_BYTE(CS[IP+1]b)
  1819. IP+=2
  1820. return
  1821.  
  1822. R_AAD:
  1823. PRINT_8088(I_AAD)
  1824. goto PBAA
  1825.  
  1826. R_TESTW:
  1827. PRINT_8088W(I_TEST)
  1828. REGT=REGB:if BYTE and 1 then REGT=REGW
  1829. REGS=CS[IP+1]b
  1830. IP+=2
  1831. PRINT_REG(REGT,REGS/8)
  1832. print ",";
  1833. PRINT_MRM(REGS,BYTE)
  1834. return
  1835.  
  1836. R_MOVR:
  1837. PRINT_8088W(I_MOV)
  1838. goto MOVR2
  1839.  
  1840. R_MOVST:
  1841. PRINT_8088(I_MOV)
  1842. BYTE=CS[IP+1]b
  1843. gosub MRM2
  1844. print ",";
  1845. PRINT_REG(SEG,(BYTE/8) and 3)
  1846. return
  1847.  
  1848. R_MOVTS:
  1849. PRINT_8088(I_MOV)
  1850. BYTE=CS[IP+1]b
  1851. PRINT_REG(SEG,(BYTE/8) and 3)
  1852. print ",";
  1853. goto MRM2
  1854.  
  1855. R_MOVIRM:
  1856. REGS=CS[IP+1]b
  1857. if REGS and 111000b then goto NULL_CONTINUE
  1858. PRINT_8088W(I_MOV)
  1859. IP+=2
  1860. PRINT_MRM(REGS,BYTE)
  1861. print ",";
  1862. if BYTE and 1
  1863.     then PRINT_WORD(CS[IP]):IP+=2
  1864.     else PRINT_BYTE(CS[IP]b):IP++
  1865. return
  1866.  
  1867. R_MOVIR:
  1868. PRINT_8088(I_MOV)
  1869. IP++
  1870. REGT=REGB:if BYTE and 8 then REGT=REGW
  1871. PRINT_REG(REGT,BYTE)
  1872. print ",";
  1873. if BYTE and 8
  1874.     then PRINT_WORD(CS[IP]):IP+=2
  1875.     else PRINT_BYTE(CS[IP]b):IP++
  1876. return
  1877.  
  1878. R_OVERS:
  1879. PRINT_8088(I_SPACE)
  1880. IP++
  1881. PRINT_REG(SEG,(BYTE/8) and 3)
  1882. print ":";
  1883. return
  1884.